package cn.pdx.elec.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import cn.pdx.elec.dao.ElecLogDao;
import cn.pdx.elec.domain.ElecLog;
import cn.pdx.elec.domain.ElecUser;
import cn.pdx.elec.service.ElecLogService;
import cn.pdx.elec.web.form.ElecLogForm;


/**
 *  @Repository 、@Service 和 @Controller 
           在目前的 Spring 版本中，这 3 个注释和 @Component 是等效的，但是从注释类的命名上，3 个注释分别和持久层 、业务层 和控制层 相对应。
 * 
 *@Transactional(readOnly=true),定义类方法的事务为只读,不能写入数据库
 * 业务类方法只有增、删、改为可写,其他事务都为只读
 * @author 彭定旭
 */
@Transactional(readOnly=true)
@Service(ElecLogService.SERVICE_NAME)   //spring不用配置
public class ElecLogServiceImpl implements ElecLogService {
   
	//业务层调用dao层;用注解
	@Resource(name=ElecLogDao.SERVICE_NAME)
	private ElecLogDao elecLogDao;

	
	/**
	 * @Name:saveElecLog
	 * @Description:保存日志信息
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-4-24(创建日期)
	 * @parameters:HttpServletRequest request,用于存放用户等相关信息
	 *             String details,操作明细
	 * @return:无
	 */
	@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)
	public void saveElecLog(HttpServletRequest request, String details) {

		ElecLog  elecLog=new ElecLog();
		elecLog.setIpAddress(request.getRemoteAddr());   //IP地址
		//因为传的是request对象,所以就可以获取session中所登录的用户了
		ElecUser elecUser=(ElecUser)request.getSession().getAttribute("globle_user");
		elecLog.setOpeName(elecUser.getUserName());  //操作人
		
		elecLog.setOpeTime(new Date());   //操作时间
		elecLog.setDetails(details);
		elecLogDao.save(elecLog);
	}


	/**
	 * @Name:findElecLogListByCondition
	 * @Description:使用查询条件查询日志信息
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-4-25(创建日期)
	 * @parameters:ElecLogForm elecLogForm 用于存放操作人信息
	 * @return:List<ElecLogForm> 日志信息列表
	 */
	public List<ElecLogForm> findElecLogListByCondition(ElecLogForm elecLogForm) {
		
		//组织查询和排序的条件
		String hqlWhere="";
		
		List<String> paramsList=new ArrayList<String>();
		
		//如果有参数就组织参数,没有的话就直接从左侧菜单进入查询全部,有的话就按姓名查询,公用一个查询就可以了
		if(elecLogForm!=null && elecLogForm.getOpeName()!=null && !elecLogForm.getOpeName().equals(""))
		{
			hqlWhere+= " and o.opeName like ?";
			paramsList.add("%"+elecLogForm.getOpeName()+"%");
		}
		//因为定义的是Object类型参数数组,所以要转换
		Object[] params=paramsList.toArray();
		
		LinkedHashMap<String, String> orderby=new LinkedHashMap<String, String>();
		
		orderby.put("o.opeTime", "desc");
		
		List<ElecLog> list=elecLogDao.findCollectionByConditionNoPage(hqlWhere, params, orderby);
		
		//PO对象——>VO对象
		List<ElecLogForm> formList=this.elecLogPOListToVoList(list);
		
		return formList;
	}


	/**
	 * @Name:elecLogPOListToVoList
	 * @Description:日志信息列表中的PO-》VO
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-4-25(创建日期)
	 * @parameters:List<ElecLog> list Po对象结果集
	 * @return:List<ElecLogForm> VO对象日志信息列表
	 */
	private List<ElecLogForm> elecLogPOListToVoList(List<ElecLog> list) {
		
		ElecLogForm elecLogForm=null;
		List<ElecLogForm> formList=new ArrayList<ElecLogForm>();
		for(int i=0;list!=null && i<list.size();i++)
		{
			ElecLog elecLog=list.get(i);
			elecLogForm=new ElecLogForm();
			elecLogForm.setLogID(elecLog.getLogID());
			elecLogForm.setIpAddress(elecLog.getIpAddress());
			elecLogForm.setOpeName(elecLog.getOpeName());
			elecLogForm.setOpeTime(String.valueOf(elecLog.getOpeTime()!=null?elecLog.getOpeTime():""));
			elecLogForm.setDetails(elecLog.getDetails());
			
			formList.add(elecLogForm);
		}
		return formList;
	}


	/**
	 * @Name:deleteElecLogByLogIDs
	 * @Description:通过日志ID删除日志列表
	 * @author 彭定旭
	 * @version：v1.00（版本号）
	 * @Create Date:2013-4-25(创建日期)
	 * @parameters:ElecLogForm elecLogForm 用于存放日志ID数组
	 * @return:无
	 */
	@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)
	public void deleteElecLogByLogIDs(ElecLogForm elecLogForm) {

     //第一种删除方式
		/*String [] logids=elecLogForm.getLogid();
		elecLogDao.deleteObjectByIds(logids);
		*/
		
		 //第二种删除方式,麻烦点
		String logID=elecLogForm.getLogID();
		String [] logids=logID.split(",");
		String [] ids=new String[logids.length];
		for(int i=0;logids!=null && i<logids.length;i++)
		{
			String logid=logids[i];
			 ids[i]=logid.trim();
		}
		elecLogDao.deleteObjectByIds(ids);
	}
	
	
	
	

	
}
